﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using Crosland.Automotriz.Logic.Linq;
using Crosland.Automotriz.Core;
using Crosland.Automotriz.Logic;
using Crosland.Automotriz.Facade.Interface;
using Crosland.Automotriz.Facade.Facade;
using System.Text;
using System.Configuration;
using System.Net.Mail;
using DevExpress.Web.ASPxEditors;
using Crosland.Automotriz.Logic.Funciones;
using Crosland.Automotriz.Logic.ControlExeption;
namespace Crosland.Automotriz.Web.Repuestos
{
    public partial class wFrmPronosticoImportacionGenerar : BaseForm
    {
        string idNegocio = ConfigurationManager.AppSettings["Negocio"];
        ActualizarPedidoLogic actualizapedido = new ActualizarPedidoLogic();
        iFacadePronosticoImportacion BL_PronosticoImportacion = new FacadePronosticoImportacion();
        MailMessage mail = new MailMessage();
        private static List<Articulos> listaArticulo = null;
        protected override void Inicializar()
        {
            ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", "JavaScript:confirmSubmitResult();", true);
            base.Inicializar();
            this.ListarCorreoPronostico();
            this.ListaOrganizacionVenta();
            //default
            cboAnioA.Text = Convert.ToString(DateTime.Now.Year);
            cboAnioD.Text = Convert.ToString(DateTime.Now.Year);
            cboOrgVenta.Value = ("2").ToString(); //Crosland Repuestos
            listaArticulo = new List<Articulos>();
            this.ListarTipoArticulo();
            this.MuestraMesDefecto();
            this.ListarGrupoArticulos();
        }


        private void ListaOrganizacionVenta()
        {
            try
            {
                clsTd_Org_VtaLogic l = new clsTd_Org_VtaLogic();
                cboOrgVenta.DataSource = l.lista();
                cboOrgVenta.ValueField = "ID_ORG_VTA";
                cboOrgVenta.TextField = "DES_ORG_VTA";
                cboOrgVenta.DataBind();
            }
            catch (Exception ex)
            {
                MensajesError("Error al lista Organización Venta", ex, "ListaOrganizacionVenta");
            }

        }

        private String ArticulosSeleccionado()
        {
            String cadenaGeneral = String.Empty;
            try
            {
                List<Object> selectItems = grdGrupoArticulos.GetSelectedFieldValues(new String[] { "ID_GRUPO_ARTICULO" });

                StringBuilder strBuilder = new StringBuilder();

                foreach (Object item in selectItems)
                {
                    String cadena = Convert.ToString(item) + ",";
                    strBuilder.Append(cadena);
                }
                cadenaGeneral = strBuilder.ToString();

             
            }
            catch (Exception e)
            {

                MensajesError("Error al obtener cadena de grupo articulos ", e, "ArticulosSeleccionado");
            }
            return cadenaGeneral;

        }




        private void ListarGrupoArticulos()
        {
            try
            {
                grdGrupoArticulos.DataSource = BL_PronosticoImportacion.listaGrupoArticuloRepuestosLLantas();
                grdGrupoArticulos.DataBind();
            }

            catch (DataException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "ListarGrupoArticulos");
                MensajesError(ex.Message, ex, "ListarGrupoArticulos");
            }
            catch (RunException e)
            {
                GuardarExceptionLog(e.Message, e, "ListarGrupoArticulos");
                MensajesError(e.Message, e, "ListarGrupoArticulos");
            }


        }



        private void PeriodoInicial()
        {

            try
            {
                int mes_d = Convert.ToInt32(cboMesD.Value);
                int num_mes = (mes_d + Convert.ToInt32(txtNumMeses.Text)) - 1;
                if (num_mes > 12)
                {
                    int mes_to = (Convert.ToInt32(cboMesD.Value)) + Convert.ToInt32(txtNumMeses.Text) - 1;
                    int meses = mes_to - 12;
                    cboMesA.Value = Convert.ToString(meses);
                    int num_anio = Convert.ToInt32(cboAnioD.Value);
                    cboAnioA.Value = (num_anio + 1).ToString();
                }
                else
                {
                    cboMesA.Value = Convert.ToString(num_mes);
                    cboAnioA.Value = cboAnioD.Value;
                };
            }
            catch (Exception ex)
            {

                GuardarExceptionLog("Error en la aplicación", ex, "PeriodoInicial");
                MensajesError("Error en la aplicación", ex, "PeriodoInicial");
            }



        }

        private void PeriodoFinal()
        {

            try
            {
                int mes_d = Convert.ToInt32(cboMesA.Value);
                int num_mes = (mes_d - Convert.ToInt32(txtNumMeses.Text)) + 1;
                if (num_mes < 1)
                {
                    int mes_to = 12 + Convert.ToInt32(cboMesA.Value) - Convert.ToInt32(txtNumMeses.Text) + 1;
                    cboMesD.Value = Convert.ToString(mes_to);
                    int num_anio = Convert.ToInt32(cboAnioA.Value);
                    cboAnioD.Value = (num_anio - 1).ToString();
                }
                else
                {
                    cboMesD.Value = Convert.ToString(num_mes);
                    cboAnioD.Value = cboAnioA.Value;
                };
            }
            catch (Exception ex)
            {

                GuardarExceptionLog("Error en la aplicación", ex, "PeriodoFinal");
                MensajesError("Error en la aplicación", ex, "PeriodoFinal");
            }



        }

        private void MuestraMesDefecto()
        {
            cboMesA.Value = DateTime.Now.Month - 1;
            this.PeriodoFinal();
        }

        private void ListarTipoArticulo()
        {
            clsGeneraImportacionLogic imp = new clsGeneraImportacionLogic();

            List<T_MAE_TABLA_GENERAL_DET> lis = imp.ListaArticulos();
            foreach (var item in lis)
            {
                Articulos l = new Articulos();
                l.Tipo_abd = item.DES_CORTA;
                l.num_mes = Convert.ToInt32(item.IMP_VALOR);
                listaArticulo.Add(l);
            }
            grdTipoArticulo.DataSource = listaArticulo;
            grdTipoArticulo.DataBind();


        }

        private struct Articulos
        {
            public string Tipo_abd { get; set; }
            public int num_mes { get; set; }
        }


        private void ListarCorreoPronostico()
        {
            try
            {
                clsGeneraImportacionLogic generarimportacionlogic = new clsGeneraImportacionLogic();
                grdListaCorreoPronostico.DataSource = generarimportacionlogic.listaCorreoPronostico();
                grdListaCorreoPronostico.DataBind();
            }
            catch (RunException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "GenerarPronostico");
                MensajesError(ex.Message, ex, "GenerarPronostico");
            }
        }

        private void EnvioCorreo()
        {
            try
            {

                Crosland.Automotriz.Seguridad.Business.clsUsuarioLogic usu = new Crosland.Automotriz.Seguridad.Business.clsUsuarioLogic();
                Crosland.Automotriz.Seguridad.Entity.T_SEG_USUARIO usuario = usu.listarUser(Session["User"].ToString())[0];
                string nombre_apellido = usuario.DES_NOMBRE + " " + usuario.DES_APELLIDOS;

                for (int i = 0; i < grdListaCorreoPronostico.VisibleRowCount; i++)
                {

                    string row = (string)(grdListaCorreoPronostico.GetRowValues(i, "DES_EMAIL")).ToString();
                    mail.From = new MailAddress(ConfigurationManager.AppSettings["MailFrom"], ConfigurationManager.AppSettings["UserNameSMTP"]);
                    mail.Subject = ("Generación Pronóstico");



                    //parametro reposicion
                    StringBuilder sb = new StringBuilder();
                    for (int x = 0; x < grdTipoArticulo.VisibleRowCount; x++)
                    {
                        ASPxTextBox l = (ASPxTextBox)grdTipoArticulo.FindRowCellTemplateControl(x, null, "txtNumMes");
                        String num_mes = (l.Text);
                        String tipo_abc = Convert.ToString(grdTipoArticulo.GetRowValues(x, "Tipo_abd"));
                        String cadenaHTML = String.Format("<tr><td>{0}</td><td>{1}</td> </tr>", tipo_abc, num_mes);
                        sb.Append(cadenaHTML);
                    }
                    String cadenaHtmlParametroReposicion = sb.ToString();


                    //parametro grupo articulo                  
                    List<Object> selectItems = grdGrupoArticulos.GetSelectedFieldValues(new String[] { "DES_GRUPO_ARTICULO" });
                    StringBuilder strBuilder = new StringBuilder();
                    foreach (Object item in selectItems)
                    {
                        String cadena = String.Format("<tr><td>{0}</td> </tr>", item);
                        strBuilder.Append(cadena);
                    }
                    String cadenaHtmlParametroGrupoArticulo = strBuilder.ToString();

                    mail.Body = String.Format(HtmlEmail.HtmlNotificacionPronosticoImportacion, "Se acaba de generar el pronostico de importación",
                    nombre_apellido, cboAnioD.Text + "-" + cboMesD.Text, cboAnioA.Text + "-" + cboMesA.Text, cadenaHtmlParametroReposicion, cadenaHtmlParametroGrupoArticulo);
                    mail.IsBodyHtml = true;
                    mail.To.Add(row);
                    SmtpClient s = new SmtpClient();
                    s.Host = ConfigurationManager.AppSettings["EmailServer"];
                    s.Port = 25;
                    s.EnableSsl = false;
                    s.UseDefaultCredentials = false;
                    s.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["MailFrom"], ConfigurationManager.AppSettings["PasswordSMTP"]);
                    s.Send(mail);
                }

            }
            catch (Exception ex) { throw ex; }

        }


        private void GenerarPronostico()
        {
            try
            {

                String cbonum_mes_ini = Convert.ToInt32(cboMesD.Value) < 10 ? "0" + cboMesD.Value : Convert.ToString(cboMesD.Value);
                String cbonum_mes_fin = Convert.ToInt32(cboMesA.Value) < 10 ? "0" + cboMesA.Value : Convert.ToString(cboMesA.Value);
                String ID_ARTICULOS = ArticulosSeleccionado();

                if (ID_ARTICULOS.Trim().Length == 0) {

                    popupMsjError.ShowOnPageLoad = true;
                    lblmensajepopup.Text = "Seleccione un grupo artículo";
                    return;
                }

                string feha_ini = cboAnioD.Text + "" + cbonum_mes_ini;
                string fecha_fin = cboAnioA.Text + "" + cbonum_mes_fin;
                if (BL_PronosticoImportacion.generarImportacion(Convert.ToInt32(cboOrgVenta.Value), ID_ARTICULOS, feha_ini, fecha_fin, this.DatosExtraidos(), Session["User"].ToString()))
                {
                    this.EnvioCorreo();
                    string script = "ShowCreateAccountWindow8();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }

            }
            catch (DataException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "GenerarPronostico");
                MensajesError(ex.Message, ex, "GenerarPronostico");
            }
            catch (RunException e)
            {
                GuardarExceptionLog(e.Message, e, "GenerarPronostico");
                MensajesError(e.Message, e, "GenerarPronostico");
            }
            catch (Exception ex)
            {
                GuardarExceptionLog(ex.Message, ex, "GenerarPronostico");
                MensajesError(ex.Message, ex, "GenerarPronostico");
            }


        }

        private void MensajesError(String msgUsu, Exception ex, String metError)
        {
            Crosland.Automotriz.Web.UserControl.MensajeError uc = (Crosland.Automotriz.Web.UserControl.MensajeError)Master.FindControl("ucErrorMensaje");
            String msgReal, fhError, pagError, codUsu;
            msgReal = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
            pagError = new System.IO.FileInfo(Page.Request.Url.AbsolutePath).Name;
            codUsu = Session["User"].ToString();
            fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
            System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
            int number = 0;
            for (int i = 0; i < trace.FrameCount; i++)
            {
                System.Diagnostics.StackFrame sf = trace.GetFrame(i);
                number = sf.GetFileLineNumber();
            }
            uc.Errores(msgUsu, msgReal, fhError, pagError, metError, codUsu, number);
        }

        private void GuardarExceptionLog(String msgUsu, Exception ex, String metError)
        {
            try
            {
                String msgReal, fhError, pagError, codUsu;
                msgReal = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
                pagError = new System.IO.FileInfo(Page.Request.Url.AbsolutePath).Name;
                codUsu = Session["User"].ToString();
                fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");

                System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
                int number = 0;
                for (int i = 0; i < trace.FrameCount; i++)
                {
                    System.Diagnostics.StackFrame sf = trace.GetFrame(i);
                    number = sf.GetFileLineNumber();
                }
                fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
                new Logg().ErrorLog(Server.MapPath("~/Logs/ErrorLog.csv"), msgUsu, msgReal, pagError, metError, codUsu, number);
            }
            catch (Crosland.Automotriz.Logic.ControlExeption.DataException e)
            {

                MensajesError(e.Message, e, "GuardarExceptionLog");
            }
            catch (RunException re)
            {
                MensajesError(re.Message, re, "GuardarExceptionLog");
            }

        }

        protected void btngene_Click(object sender, EventArgs e)
        {
            this.GenerarPronostico();

        }

        protected void grdListaCorreoPronostico_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
        {
            this.ListarCorreoPronostico();
        }
      

        private string DatosExtraidos()
        {
            try
            {
                string CadenaTotal = string.Empty;
                string cadenaA_NumMes = string.Empty;
                string strCadena = string.Empty;
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < grdTipoArticulo.VisibleRowCount; i++)
                {
                    ASPxTextBox l = (ASPxTextBox)grdTipoArticulo.FindRowCellTemplateControl(i, null, "txtNumMes");
                    int num_mes = (l.Text == "" ? 0 : Convert.ToInt32(l.Text)) * (30);
                    String tipo_abc = Convert.ToString(grdTipoArticulo.GetRowValues(i, "Tipo_abd"));
                    cadenaA_NumMes = ("0000" + num_mes);

                    if (tipo_abc == "C1" || tipo_abc == "C2" || tipo_abc == "C3" || tipo_abc == "C4" || tipo_abc == "C5")
                    {
                        CadenaTotal = Convert.ToString(grdTipoArticulo.GetRowValues(i, "Tipo_abd")) + LeftRightMid.Right(cadenaA_NumMes, 3);
                    }
                    else
                    {
                        CadenaTotal = Convert.ToString(grdTipoArticulo.GetRowValues(i, "Tipo_abd")) + LeftRightMid.Right(cadenaA_NumMes, 4);
                    }

                    sb.Append(CadenaTotal);
                }
                return strCadena = sb.ToString();

            }
            catch (Exception ex)
            {


                lblmej.Text = "ERROR: " + ex.Message;
                popupmensajes.ShowOnPageLoad = true;
                return null;
            }

        }

        protected void cboMesD_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PeriodoInicial();
        }


        protected void cboMesA_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PeriodoFinal();
        }

        protected void cboAnioD_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PeriodoInicial();
        }

        protected void cboAnioA_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PeriodoFinal();
        }

        protected void grdGrupoArticulos_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
        {
            this.ListarGrupoArticulos();
        }

        protected void grdGrupoArticulos_PageIndexChanged(object sender, EventArgs e)
        {
            this.ListarGrupoArticulos();
        }

        protected void txtNumMeses_NumberChanged(object sender, EventArgs e)
        {
            this.PeriodoFinal();
        }

      
    }
}